﻿using System;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using System.Collections.Generic;
using Engine;
using Library;
using MyControls;
using Gencode;
using Action=Library.Action;

namespace GameTool
{
    public partial class DuaXe_Form1 : Form
    {
        #region Declare variables
        public MainForm mainForm;
        private int _currentComponent = -1;
        private int _currentGroup = 0;
        private List<List<XeThoCom>> _components = null;
        public List<List<XeThoCom>> Components
        {
            set { _components = value; }
            get
            {
                if (_components == null)
                    _components = new List<List<XeThoCom>>();
                if(_components.Count == 0)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        _components.Add(new List<XeThoCom>());
                        AddGroup(i.ToString());
                    }
                }
                txtCounter.Text = _components[_currentGroup].Count.ToString();
                cmdDelete.Visible = (_components[_currentGroup].Count > 0);
                return _components;
            }
        }
        private bool _isClearTab = false;
        #endregion

        #region Constructor
        public DuaXe_Form1()
        {
            InitializeComponent();
        }
        #endregion

        #region User's Methods
        private void LoadXMLDeBai(string url, string filename)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                this.cmbLop.Text = DuaXe_From2.Instance.Lop;
                this.cmbVong.Text = DuaXe_From2.Instance.Vong;
                // Parser File Xml.
                XmlNodeList pointNode = xDoc.GetElementsByTagName("point");
                string point = pointNode[0].InnerText;
                this.nUDDiem.Value = Int32.Parse(point);

                XmlNodeList time = xDoc.GetElementsByTagName("time");
                string timeString = time[0].InnerText;
                this.nUDThoiGian.Value = Int32.Parse(timeString);

                XmlNodeList code = xDoc.GetElementsByTagName("code");
                string codeString = code[0].InnerText;
                this.txtBaiThiSo.Text = codeString;

                XmlNodeList maxErrorNode = xDoc.GetElementsByTagName("numError");
                string maxError = maxErrorNode[0].InnerText;
                this.nUDSoLoi.Value = Convert.ToByte(maxError);

                XmlNodeList numLevel1Node = xDoc.GetElementsByTagName("numLevel1");
                string numLevel1 = numLevel1Node[0].InnerText;
                if (numLevel1.Length > 0)
                    this.nUDDe.Value = Convert.ToByte(numLevel1);
                else
                    this.nUDDe.Value = 0;

                XmlNodeList numLevel2Node = xDoc.GetElementsByTagName("numLevel2");
                string numLevel2 = numLevel2Node[0].InnerText;
                if (numLevel2.Length > 0)
                    this.nUDBinhThuong.Value = Convert.ToByte(numLevel2);
                else
                    this.nUDBinhThuong.Value = 0;

                XmlNodeList numLevel3Node = xDoc.GetElementsByTagName("numLevel3");
                string numLevel3 = numLevel3Node[0].InnerText;
                if (numLevel3.Length > 0)
                    this.nUDKho.Value = Convert.ToByte(numLevel3);
                else
                    this.nUDKho.Value = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void LoadXMLCauHoi(string url, string filename)
        {
            try
            {
                XmlDocument xDoc = new XmlDocument();

                this.cmbLop.Text = DuaXe_From2.Instance.Lop;
                this.cmbVong.Text = DuaXe_From2.Instance.Vong;

                ftp_main.download(url, filename);
                xDoc.Load(filename);

                XmlNodeList questionList = xDoc.GetElementsByTagName("question");
                for (int i = 0; i < questionList.Count; i++)
                {
                    XmlNode question = questionList[i];
                    XeThoCom xeThoCom = new XeThoCom();

                    string type = question.Attributes[0].Value;
                    xeThoCom.IsTuLuan = type;

                    XmlNodeList children = question.ChildNodes;
                    string questionLevel = children[0].InnerText;
                    xeThoCom.Level = questionLevel;

                    string questionCode = children[1].InnerText;

                    string subjectString = children[2].InnerText;
                    xeThoCom.MainFileName = subjectString;
                    Bitmap image = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text, subjectString));
                    xeThoCom.Image = image;
                    xeThoCom.Modify = false;

                    XmlNode answerList = children[3];
                    XmlNodeList answer = answerList.ChildNodes;
                    for (int j = 0; j < answer.Count; j++)
                    {
                        ChildXeThoCom childXeThoCom = new ChildXeThoCom();
                        childXeThoCom.Modify = false;
                        string answerString = answer[j].InnerText;
                        string value = answer[j].Attributes[0].Value;

                        if (type == "1") // Tu luan
                        {
                            childXeThoCom.Value = answerString;
                            childXeThoCom.IsTrue = value;
                            childXeThoCom.IsTuLuan = true;
                        }
                        else
                        {
                            childXeThoCom.ChildFileName = answerString;
                            childXeThoCom.IsTrue = value;
                            Bitmap answerimage = new Bitmap(ftp_main.GetPicture(GetImagePath() + "\\" + cmbVong.Text, answerString));
                            childXeThoCom.Image = answerimage;
                            childXeThoCom.IsTuLuan = false;
                        }
                        xeThoCom.AppendCom(childXeThoCom);
                        xeThoCom.ShowCom();
                    }
                    AddCom(xeThoCom, int.Parse(xeThoCom.Level), Components[int.Parse(xeThoCom.Level)].Count);
                }

                _currentComponent = (this.Components[_currentGroup].Count > 0) ? 0 : -1;
                ShowCom();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private string UploadXMLDeBai()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);

                XmlNode examinateNode = doc.CreateElement("Examinates");
                doc.AppendChild(examinateNode);

                XmlNode pointNode = doc.CreateElement("point");
                pointNode.AppendChild(doc.CreateTextNode(this.nUDDiem.Text.Trim()));
                examinateNode.AppendChild(pointNode);

                XmlNode timeNode = doc.CreateElement("time");
                timeNode.AppendChild(doc.CreateTextNode(this.nUDThoiGian.Text.Trim()));
                examinateNode.AppendChild(timeNode);

                XmlNode codeNode = doc.CreateElement("code");
                codeNode.AppendChild(doc.CreateTextNode(this.txtBaiThiSo.Text));
                examinateNode.AppendChild(codeNode);

                XmlNode errorNode = doc.CreateElement("numError");
                errorNode.AppendChild(doc.CreateTextNode(this.nUDSoLoi.Text.Trim()));
                examinateNode.AppendChild(errorNode);

                XmlNode level1Node = doc.CreateElement("numLevel1");
                level1Node.AppendChild(doc.CreateTextNode(this.nUDDe.Text.Trim()));
                examinateNode.AppendChild(level1Node);

                XmlNode level2Node = doc.CreateElement("numLevel2");
                level2Node.AppendChild(doc.CreateTextNode(this.nUDBinhThuong.Text.Trim()));
                examinateNode.AppendChild(level2Node);

                XmlNode level3Node = doc.CreateElement("numLevel3");
                level3Node.AppendChild(doc.CreateTextNode(this.nUDKho.Text.Trim()));
                examinateNode.AppendChild(level3Node);

                string xmlFile = "1.xml";
                doc.Save(xmlFile);
                UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text, xmlFile, xmlFile);
                System.IO.File.Delete(xmlFile);

                INSERT();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }
        
        private string UploadXMLCauHoi()
        {
            string result = string.Empty;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);

                XmlNode examinateNode = doc.CreateElement("Examinates");
                doc.AppendChild(examinateNode);

                XmlNode QuestionsNode = doc.CreateElement("questions");
                examinateNode.AppendChild(QuestionsNode);

                // BEGIN Duyet danh sach component va add vao xml.
                for (int group = 0; group < this.Components.Count; group++)
                {
                    for (int i = 0; i < this.Components[group].Count; i++)
                    {
                        List<XeThoCom> thisCom = this.Components[group];
                        // Moi phan tu la mot question
                        XmlNode question = doc.CreateElement("question");

                        XmlAttribute type = doc.CreateAttribute("type");
                        type.Value = thisCom[i].IsTuLuan;
                        question.Attributes.Append(type);

                        XmlAttribute typeTest = doc.CreateAttribute("typeTest");
                        typeTest.Value = "4";
                        question.Attributes.Append(typeTest);

                        XmlNode questionLevel = doc.CreateElement("level");
                        questionLevel.AppendChild(doc.CreateTextNode(thisCom[i].Level));
                        question.AppendChild(questionLevel);

                        XmlNode codeNode = doc.CreateElement("code");
                        codeNode.AppendChild(doc.CreateTextNode(i.ToString()));
                        question.AppendChild(codeNode);

                        XmlNode subjectNode = doc.CreateElement("subject");

                        // Upload file anh - Question
                        thisCom[i].MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));
                        if (thisCom[i].Modify)
                        {
                            string pathName = thisCom[i].FullPath;
                            UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text, thisCom[i].MainFileName, pathName);
                        }
                        thisCom[i].ChangeStatusToLoad();

                        string mainFileName = thisCom[i].MainFileName;
                        subjectNode.AppendChild(doc.CreateTextNode(mainFileName));
                        question.AppendChild(subjectNode);

                        XmlNode answersNode = doc.CreateElement("answers");
                        // Duyet cac cau tra loi
                        foreach (ChildXeThoCom childXeThoCom in thisCom[i].Component)
                        {
                            XmlNode answerNode = doc.CreateElement("answer");
                            XmlAttribute Value = doc.CreateAttribute("value");

                            childXeThoCom.MyCapture(int.Parse(cmbLop.Text.Substring(3, cmbLop.Text.Length - 3)));
                            Value.Value = childXeThoCom.IsTrue;
                            answerNode.Attributes.Append(Value);
                            if (type.Value == "1")
                            {
                                answerNode.AppendChild(doc.CreateTextNode(childXeThoCom.Value));
                            }
                            else
                            {
                                answerNode.AppendChild(doc.CreateTextNode(childXeThoCom.ChildFileName));
                                // Upload 4 file anh - answers
                                if (childXeThoCom.Modify)
                                {
                                    string pathAnswer = childXeThoCom.FullPath;
                                    UploadFile.UpFtpFile(GetImagePath(), cmbVong.Text, childXeThoCom.ChildFileName,
                                                         pathAnswer);
                                }
                                childXeThoCom.ChangeStatusToLoad();
                            }
                            answersNode.AppendChild(answerNode);
                        }
                        question.AppendChild(answersNode);

                        QuestionsNode.AppendChild(question);
                    }
                }
                // END
                string xmlFile = "question.xml";
                doc.Save(xmlFile);
                UploadFile.UpFtpFile(GetXMLPath(), cmbVong.Text, xmlFile, xmlFile);
                System.IO.File.Delete(xmlFile);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return result;
        }
        
        /// <summary>
        /// Thêm component
        /// </summary>
        /// <param name="com">Component cần thêm</param>
        /// <param name="group">Nhóm cần thêm</param>
        /// <param name="index">Vị trí thêm</param>
        private void AddCom(XeThoCom com, int group, int index)
        {
            try
            {
                com.Visible = false;
                Components[group].Insert(index, com);
                this.pnlQuestion.Controls.Add(com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
                Application.Exit();
            }
        }

        /// <summary>
        /// Hiển thị component ở currentGroup currentComponent
        /// </summary>
        private void ShowCom()
        {
            try
            {
                if (_currentComponent < Components[_currentGroup].Count && - 1 < _currentComponent)
                {
                    Components[_currentGroup][_currentComponent].Visible = true;
                    Components[_currentGroup][_currentComponent].STT = (_currentComponent + 1).ToString();
                    Components[_currentGroup][_currentComponent].Location = new Point(10 + cmdAddNormal.Size.Width, 8);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Ẩn component ở vị trí currentGroup currentComponent
        /// </summary>
        private void HideCom()
        {
            try
            {
                if (-1 < _currentComponent && _currentComponent < Components[_currentGroup].Count)
                    Components[_currentGroup][_currentComponent].Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Xóa XeThoCom ở currentGroup currentComponent
        /// </summary>
        private void DelCom()
        {
            try
            {
                List<XeThoCom> _list = this.Components[_currentGroup];
                if(-1 < _currentComponent && _currentComponent <= _list.Count - 1)
                {
                    this.pnlQuestion.Controls.Remove(_list[_currentComponent]);
                    _list.RemoveAt(_currentComponent);
                }
                
                if(_currentComponent > _list.Count -1)
                    _currentComponent--;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Đổ dữ liệu vào các combobox
        /// </summary>
        private void InitData()
        {
            try
            {
                foreach (ClassInfo c in Common.ClassList)
                {
                    if (User.CheckPermission(c.Name))
                    {
                        cmbLop.Items.AddRange(new object[] { "lop" + c.Name });
                    }
                }
                if (cmbLop.Items.Count > 0)
                {
                    cmbLop.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        /// <summary>
        /// Lấy vị trí cần lưu file xml trên server
        /// </summary>
        /// <returns></returns>
        private string GetXMLPath()
        {
            return Common.config.pathXml + "\\" + cmbLop.Text + "\\Game5";
        }

        /// <summary>
        /// Lấy vị trí lưu file ảnh trên server
        /// </summary>
        /// <returns></returns>
        private string GetImagePath()
        {
            return Common.config.pathImage + "\\" + cmbLop.Text + "\\Game5";
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi lưu
        /// </summary>
        /// <returns>Thông điệp trả về: thông điệp trắng là hợp lệ</returns>
        private string ValidateInput()
        {
            string _mess = string.Empty;
            try
            {
                if (!chkViolympic.Checked && !chkViSchool.Checked && !chkViother.Checked)
                {
                    _mess = "Bạn chưa chọn nhập liệu cho chương trình nào.";
                    chkViolympic.Focus();
                    return _mess;
                }
                if (cmbLop.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn lớp.";
                    cmbLop.DroppedDown = true;
                    cmbLop.Focus();
                    return _mess;
                }
                if (cmbVong.SelectedIndex < 0)
                {
                    _mess = "Bạn chưa chọn Vòng.";
                    cmbVong.DroppedDown = true;
                    cmbVong.Focus();
                    return _mess;
                }
                int _totalQuestion = (int)(nUDDe.Value + nUDBinhThuong.Value + nUDKho.Value);
                if (_totalQuestion == 0)
                {
                    _mess = "S. câu dễ + S. câu tb + S. câu khó > 0.";
                    nUDDe.Focus();
                    return _mess;
                }

                #region Kiểm tra xem câu hỏi đã có câu trả lời chưa
                for (int i = 0; i < Components.Count; i++)
                {
                    int _idx = 0;
                    string _subMess = string.Empty;
                    foreach (XeThoCom xeThoCom in Components[i])
                    {
                        _idx++;
                        if (xeThoCom.Component.Count == 0)
                        {
                            if (_subMess.Length > 0)
                                _subMess += ", ";
                            _subMess += _idx.ToString();
                        }
                    }
                    if (_subMess.Length > 0)
                    {
                        _subMess = Common.Level[i.ToString()] + ": Phần tử: " + _subMess;
                        if(_mess.Length > 0)
                        {
                            _mess += "\n";
                        }
                        _mess += _subMess;
                    }
                }
                if (_mess.Length > 0)
                    _mess += "\nchưa có đáp án.";

                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }

            return _mess;
        }

        private string Warning()
        {
            string _mess = string.Empty;
            try
            {
                int _e = 0;
                int _m = 0;
                int _h = 0;
                foreach (List<XeThoCom> list in Components)
                {
                    foreach (XeThoCom com in list)
                    {
                        switch (com.Level)
                        {
                            case "0":
                                _e++;
                                break;
                            case "1":
                                _m++;
                                break;
                            case "2":
                                _h++;
                                break;
                        }
                    }
                }
                if (_e < nUDDe.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu dễ chưa đủ";
                }

                if (_m < nUDBinhThuong.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu tb chưa đủ";
                }

                if (_h < nUDKho.Value)
                {
                    if (_mess.Length > 0)
                        _mess += "\n";
                    _mess += "- S. câu khó chưa đủ";
                }

                if (_mess.Length > 0)
                    _mess += "\nđể game chạy!";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
            return _mess;
        }

        /// <summary>
        /// Reset các control về giá trị ban đầu.
        /// </summary>
        private void Reset()
        {
            try
            {
                chkViother.Checked = chkViSchool.Checked = !(chkViolympic.Checked = true);
                if (cmbLop.Items.Count > 0)
                    cmbLop.SelectedIndex = 0;
                cmbVong.SelectedIndex = -1;
                nUDDe.Value = nUDDe.Minimum;
                nUDBinhThuong.Value = nUDBinhThuong.Minimum;
                nUDKho.Value = nUDKho.Minimum;
                nUDDiem.Value = nUDDiem.Minimum;
                nUDSoLoi.Value = nUDSoLoi.Minimum;
                nUDDiemThuong.Value = nUDDiemThuong.Minimum;
                nUDThoiGian.Value = nUDThoiGian.Minimum;
                txtBaiThiSo.Clear();
                txtTenBaiThi.Clear();
                pnlQuestion.Visible = true;
                for (int i = 0; i < Components.Count; i++)
                {
                    _currentGroup = i;
                    List<XeThoCom> list = Components[_currentGroup];
                    _currentComponent = (list.Count > 0) ? 0 : -1;
                    while (list.Count > 0)
                    {
                        DelCom();
                    }
                }
                _currentGroup = 0;
                _currentComponent = -1;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        
        /// <summary>
        /// Add các tabpage (~ nhóm)
        /// </summary>
        /// <param name="groupName">Tên nhóm</param>
        private void AddGroup(string groupName)
        {
            try
            {
                TabPage tab = new TabPage();
                tab.Name = groupName;
                tab.Text = Common.Level[groupName];
                this.tabGroup.TabPages.Add(tab);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Events

        private void btnReview_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult =
                    MessageBox.Show(
                        "Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn xem đề?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (_dialogResult == System.Windows.Forms.DialogResult.No)
                return;
            try
            {
                DuaXe_From2.Instance.ShowDialog();
                string lop = DuaXe_From2.Instance.Lop;
                string vong = DuaXe_From2.Instance.Vong;

                String url = Common.config.pathXml + "\\" + lop + "\\Game5\\" + vong;

                if (lop.Length > 0 && vong.Length > 0)
                {
                    #region Reset
                    pnlQuestion.Visible = true;
                    for (int i = 0; i < Components.Count; i++)
                    {
                        _currentGroup = i;
                        List<XeThoCom> _list = this.Components[_currentGroup];
                        _currentComponent = (_list.Count > 0) ? 0 : -1;
                        while (_list.Count > 0)
                        {
                            DelCom();
                        }
                    }

                    Components.Clear();
                    this._isClearTab = true;
                    tabGroup.TabPages.Clear();
                    this._isClearTab = false;
                    _currentGroup = 0;
                    _currentComponent = -1;
                    #endregion
                    string fileDebai = "1.xml";
                    LoadXMLDeBai(url, fileDebai);

                    string fileCauHoi = "question.xml";
                    LoadXMLCauHoi(url, fileCauHoi);
                }
                DuaXe_From2.Instance.Vong = DuaXe_From2.Instance.Lop = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void btnNextQuest_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Components[_currentGroup].Count == 0)
                {
                    MessageBox.Show("Không có câu hỏi nào.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (_currentComponent == this.Components[_currentGroup].Count - 1)
                {
                    MessageBox.Show("Bạn đang xem câu hỏi cuối cùng.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    HideCom();
                    _currentComponent++;
                    ShowCom();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void btnPreQuest_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Components[_currentGroup].Count == 0)
                {
                    MessageBox.Show("Không có câu hỏi nào.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (_currentComponent == 0)
                {
                    MessageBox.Show("Bạn đang xem câu hỏi đầu tiên.", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    HideCom();
                    _currentComponent--;
                    ShowCom();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cmbVong.Items.Clear();
                foreach (RoundInfo roundInfo in Common.RoundList[cmbLop.SelectedIndex])
                {
                    this.cmbVong.Items.AddRange(new object[] { "level" + roundInfo.RoundNumber });
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void DuaXe_Form1_Load(object sender, EventArgs e)
        {
            InitData();
            pnlQuestion.Visible = false;
        }
        
        private void cmdAddNormal_Click(object sender, EventArgs e)
        {
            try
            {
                XeThoCom xeThoCom = new XeThoCom();
                xeThoCom.Level = tabGroup.SelectedIndex.ToString();
                if (-1 < _currentComponent && _currentComponent < Components[_currentGroup].Count)
                {
                    xeThoCom.IsTuLuan = Components[_currentGroup][_currentComponent].IsTuLuan;
                    HideCom();
                }
                
                AddCom(xeThoCom, _currentGroup, Components[_currentGroup].Count);
                _currentComponent = this.Components[_currentGroup].Count - 1;
                ShowCom();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void cmdDelete_Click(object sender, EventArgs e)
        {
            DialogResult _dialogResult = MessageBox.Show("Xóa phần tử này?", "Xac nhan thao tac",
                                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (_dialogResult == DialogResult.No)
            {
                return;
            }
            DelCom();
            ShowCom();
        }
        
        private void btnUploadDe_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult;
                string _mess;
                bool _exists;
                bool isUpload = true;
                #region Validate?
                _mess = ValidateInput();
                if (_mess.Length > 0)
                {
                    _mess += "\nVui lòng kiểm tra lại!";
                    MessageBox.Show(_mess, "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                #endregion
                #region Up đề bài
                #region Có hỏi han
                /* hỏi nhiều quá tạm bỏ do phần qua trọng hơn là phần câu hỏi ở dưới
                _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text, "1.xml");
                isUpload = true;
                if (_exists)
                {
                    _dialogResult = MessageBox.Show("Đề bài của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    UploadXMLDeBai();
                    Common.LogAction(Action.Update);
                    MessageBox.Show("Tải đề lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }*/
                #endregion
                #region Không hỏi han
                UploadXMLDeBai();
                Common.LogAction(Action.Update);
                #endregion
                #endregion

                #region Up câu hỏi?
                _exists = ftp_main.CheckExists(GetXMLPath() + "\\" + cmbVong.Text, "question.xml");
                isUpload = true;
                if (_exists)
                {
                    _dialogResult = MessageBox.Show("Ngân hàng câu hỏi của lớp này, vòng này đã có. Bạn có muốn ghi đè hay không?",
                                                   "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (_dialogResult == DialogResult.No)
                    {
                        isUpload = false;
                    }
                }
                if (isUpload)
                {
                    #region Warning
                    _mess = Warning();
                    if (_mess.Length > 0)
                    {
                        _mess += "\nBạn có muốn tải lên server?";
                        _dialogResult = MessageBox.Show(_mess, "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (_dialogResult == DialogResult.No)
                        {
                            return;
                        }
                    }
                    #endregion
                    UploadXMLCauHoi();
                    Common.LogAction(Action.Update);
                    MessageBox.Show("Tải câu hỏi lên server thành công!", "Thong bao", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        private void btnTaoDeMoi_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult _dialogResult =
                    MessageBox.Show("Dữ liệu sẽ bị mất nếu bạn chưa tải lên server. Bạn có chắc chắn muốn tạo mới?\n\n\n(Nhấn Yes chương trình sẽ xóa bỏ mọi dữ liệu hiện có, nếu bạn chưa tải lên server\nNhấn No để giữ nguyên trạng thái)",
                        "Xac nhan thao tac", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if(_dialogResult == DialogResult.Yes)
                    Reset();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }

        private void tabGroup_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                /*
             * Khi load đề lên thì phải xóa hết các nhóm của đề cũ
             * Để xóa các nhóm cũ thì phải xóa các tabpage
             * Xóa tabpage thì sự kiện này xảy ra và sinh lỗi
             * Checkk biến để biết khi xóa tabpage ta không xử lý gì cả
             */
                if (_isClearTab)
                    return;
                HideCom();
                _currentGroup = int.Parse(tabGroup.TabPages[tabGroup.SelectedIndex].Name);
                _currentComponent = (Components[_currentGroup].Count > 0) ? 0 : -1;
                ShowCom();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi!", "Canh bao", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Common.LogException(ex);
                Application.Exit();
            }
        }
        #endregion

        #region Access to database
        private void INSERT()
        {
            GameQuestion insertDataBase = new GameQuestion();
            GameQuestionInfo gameInfo = new GameQuestionInfo();
            gameInfo.ClassID = ((ClassInfo)Common.ClassList[cmbLop.SelectedIndex]).ID;
            gameInfo.CodeName = this.txtBaiThiSo.Text;
            gameInfo.Description = "Dua Xe";
            gameInfo.GameID = 5;
            gameInfo.QuestionID = 1;
            gameInfo.SubjectID = 1;
            gameInfo.Round = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).RoundNumber;
            gameInfo.RoundID = ((RoundInfo)Common.RoundList[cmbLop.SelectedIndex][cmbVong.SelectedIndex]).ID;
            gameInfo.Type = 0;
            insertDataBase.Insert(gameInfo);
        }
        #endregion
    }
}
